# ________________________________________________________________
"""
{1} 功能：
    - 一个学习使用的测试爬虫
    - 爬取百度热热点信息
{2} 作者：void_bug
{3} 时间：2021年 08月 24日 星期二 18:41:08 CST
"""
# ________________________________________________________________

import scrapy

from FirstScrapy.items import BaiduscrapyItem


class BaiduSpider(scrapy.Spider):
    """
     :param name: 爬虫文件的名称，当前源文件的唯一标识
     :param allowed_domains: 允许的域名，可以不写，用于限定域名(start_urls 只能执行 allowed_domains 的域名下的url列表)
     :param start_urls: 启始的url列表，自动使用 get 方法进行数据请求
     :param parse 将被调用以处理为每个请求下载的响应的方法。Response参数是 TextResponse 它保存页面内容，并具有进一步有用的方法来处理它。
     备注：{1} 这个 parse() 方法通常解析响应，将抓取的数据提取为字典，还查找要遵循的新URL并创建新请求 (Request )。
     :return
         {1} 运行命令 scrapy crawl baidu 后，默认会输出工程的日志信息
         {2} 也可以在后面跟一个参数nolog,即scrapy crawl spider_name --nolog
         {3} settings.py
             {3.1} ROBOTSTXT_OBEY = True 表示遵从 robots 协议，我们需要把 True 改成 False
             {3.2} USER_AGENT = your user agent 找一个 user agent 填写到此处
             {3.3} 可以指定类型日志的输出 LOG_LEVEL = "ERROR" 可以这样写，也可以使用 {2} 方法进行操作，本人推荐使用 {2}，具体情况因需求而定
             {3.4} FEED_EXPORT_ENCODING = 'UTF-8' 可以解决乱码问题，如果不能的话，可以尝试使用 'GBK' 编码格式，若还不行请尝试 'GB2312' 编码格式
        {4} 运行过程
            SCrapy计划 scrapy.Request 方法返回的对象 start_requests 蜘蛛的方法。
            在接收到每个请求的响应后，它会实例化 Response 对象，
            并调用与请求关联的回调方法(在本例中， parse 方法)将响应作为参数传递。
        {5}学习如何使用scrappy提取数据的最佳方法是使用 Scrapy shell . 运行：
        - 测试运行：
        adminuser@Void:~/scrapyProject/FirstScrapy$ scrapy shell www.baidu.com --nolog
        [s] Available Scrapy objects:
        [s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
        [s]   crawler    <scrapy.crawler.Crawler object at 0x7fe2b606d190>
        [s]   item       {}
        [s]   request    <GET http://www.baidu.com>
        [s]   response   <200 http://www.baidu.com>
        [s]   settings   <scrapy.settings.Settings object at 0x7fe2b606adf0>
        [s]   spider     <BaiduSpider 'baidu' at 0x7fe2b5d6a520>
        [s] Useful shortcuts:
        [s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
        [s]   fetch(req)                  Fetch a scrapy.Request and update local objects
        [s]   shelp()           Shell help (print this help)
        [s]   view(response)    View response in a browser
        In [1]: 测试位置
    {6} 更多内容请参考以下文档
    - https://www.osgeo.cn/scrapy/intro/tutorial.html 官方文档
    - https://www.yuque.com/void_bug/fhw0hm/ea44g5 scrapy对象的Response对象简述语雀文档
    - https://zhuanlan.zhihu.com/p/40332579 Scrapy详解之Response
    """
    name = 'baidu'
    start_json = []
    # allowed_domains = ['www.baidu.com']
    start_urls = ['https://top.baidu.com/board?tab=realtime']

    def parse(self, response, **kwargs):
        filename = response.url.split("/")[-2]
        # //*[@id="sanRoot"]/main/div[2]/div/div[2]/div[3]/div[2]/a/div[1]
        # //*[@id="sanRoot"]/main/div[2]/div/div[2]/div[2]/div[2]/a/div[1]
        # //*[@id="sanRoot"]/main/div[2]/div/div[2]/div[1]/div[2]/a/div[1]

        # 总结 ：
        # //*[@id="sanRoot"]/main/div[2]/div/div[2]/div/div[2]/a/div[1]
        args = response.xpath("""//*[@id="sanRoot"]/main/div[2]/div/div[2]/div/div[2]/a/div[1]/text()""").extract()
        for arg in args:
            arg = arg.replace(" ", "").replace("#", "")
            items = BaiduscrapyItem()
            items['hostBaidu'] = str(arg)
            yield items
        # print(self.start_json)
